package Figuras;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;

public class Circulo extends FiguraConRelleno {

    private double radioDelCirculo;

    // Funciones Básicas para creación y uso de la Figura:
    public Circulo(Point2D puntoDeInicio, double radio, Color colorDelBorde, Color colorDelRelleno,
            int grosorDelBorde) {
        super(puntoDeInicio, colorDelBorde, colorDelRelleno, grosorDelBorde);
        fijarRadioDelCirculo(radio);
    }

    public Circulo(int coordenadaX, int coordenadaY, double radio, Color colorDelBorde, Color colorDelRelleno,
            int grosorDelBorde) {
        super(coordenadaX, coordenadaY, colorDelBorde, colorDelRelleno, grosorDelBorde);
        fijarRadioDelCirculo(radio);
    }

    @Override
    public void dibujarLaFigura(Graphics dibujarCirculo) {
        Graphics2D dibujarCirculo2D;
        Ellipse2D elipse;
        Stroke bordeDeLaElipse;
        if (dameElColorDelQueEstaRellenada() != null) {
            dibujarCirculo.setColor(dameElColorDelQueEstaRellenada());
            dibujarCirculo.fillOval((int) dameElInicioDeLaFigura().getX() - (int) radioDelCirculo,
                    (int) dameElInicioDeLaFigura().getY() - (int) radioDelCirculo,
                    (int) radioDelCirculo * 2, (int) radioDelCirculo * 2);
        }
        elipse = new Ellipse2D.Float((int) dameElInicioDeLaFigura().getX() - (int) radioDelCirculo,
                (int) dameElInicioDeLaFigura().getY() - (int) radioDelCirculo,
                (int) radioDelCirculo * 2, (int) radioDelCirculo * 2);
        dibujarCirculo2D = (Graphics2D) dibujarCirculo;
        bordeDeLaElipse = new BasicStroke(dameElGrosorDelBordeDeLaFigura(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        dibujarCirculo2D.setColor(dameElColorDelBorde());
        dibujarCirculo2D.setStroke(bordeDeLaElipse);
        dibujarCirculo2D.draw(elipse);
    }

    @Override
    public boolean estaDentroDelAreaDeDibujo(int coordenadaX, int coordenadaY) {
        boolean estaDentro = false;
        double dimensionesDelCirculo;
        dimensionesDelCirculo = Math.sqrt(((dameElInicioDeLaFigura().getX() - coordenadaX)
                * (dameElInicioDeLaFigura().getX() - coordenadaX))
                + ((dameElInicioDeLaFigura().getY() - coordenadaY)
                * (dameElInicioDeLaFigura().getY() - coordenadaY)));
        if (dimensionesDelCirculo < dameElRadioDelCirculo()) {
            estaDentro = true;
        }
        return estaDentro;
    }

    @Override
    public void fijarPosicionDeLaFigura(int coordenadaX, int coordenadaY) {
        fijarElInicioDeLaFigura(coordenadaX, coordenadaY);
    }

    // Funciones Lógicas de la Figura:
    public final double dameElRadioDelCirculo() {
        return radioDelCirculo;
    }

    public final void fijarRadioDelCirculo(double radioDelCirculo) {
        this.radioDelCirculo = radioDelCirculo;
    }
}